home *** CD-ROM | disk | FTP | other *** search
- /*--------------------------------------------------------------------*
- * stoe.c = SJIS --> EUC Ver. 2.4 L. 00 *
- * *
- * MS-DOS (or UNIX) *
- * *
- * MS-C Ver. 6.00 *
- * *
- * create 1989.03 KU666 *
- * modify 1993.02.19 KU666 *
- * *
- *--------------------------------------------------------------------*/
- #include <stdio.h>
- #include <string.h>
- #include <process.h>
-
- #define MS_DOS 1
-
- #if MS_DOS
- #include <io.h>
- #include <dos.h>
- #endif
-
- #define LINE_MAX 65535
- #define BUFF_MAX 256
- #define PATH_MAX 80
-
- #if TC
- #define EXDEV ENOTSAM
- #endif
-
- #define OFF 0
- #define ON 1
- #define VER "2.4"
-
- unsigned char buff1[BUFF_MAX], buff2[BUFF_MAX];
- char com1[PATH_MAX], temp[PATH_MAX];
- int file_cnt;
- int not_kanji, /* ATT 漢字コード外 */
- opt_flg, /* */
- owrt_flg, /* over write flag */
- name_flg; /* */
- FILE *fp1, *fp2;
-
- void err_msg1(void);
- void para_chk(char *[]);
- void file_open(char *[]);
- void kana_cnv(int *, int *);
- void kanji_cnv(int *, int *);
- void file_mv(char *, char *);
- void err_msg2(char *[]);
-
- main (int argc, char *argv[])
- {
- unsigned i;
- static int j, k;
-
- strcpy(temp, "wk_____");
-
- if (argc == 1) {
- err_msg1();
- }
- para_chk(argv);
-
- for (file_cnt = 1+opt_flg; file_cnt < argc; file_cnt++) {
-
- file_open(argv);
-
- for (i = 0; i < LINE_MAX; i++) {
- if (NULL == fgets (buff1, BUFF_MAX, fp1)) {
- break;
- }
- for (j = 0, k = 0; j < BUFF_MAX; j++, k++) {
- buff2[k] = buff1[j];
- if (buff1[j] == (unsigned char)NULL) {
- break;
- }
- if (0xa0 <= buff1[j] && buff1[j] <= 0xdf){/* かな */
- kana_cnv(&j, &k);
- } else { /* 漢字 */
- kanji_cnv(&j, &k);
- }
- }
- fputs(buff2, fp2); /* write file */
- }
-
- fclose(fp1);
- if (opt_flg == ON) {
- fclose(fp2);
- }
-
- if (owrt_flg == 1) { /* file delete */
- printf("file name = %s\n", argv[file_cnt]);
- file_mv(temp, argv[file_cnt]); /* file mv */
- }
- err_msg2(argv); /* error messge */
- }
- return (0);
- }
-
- void para_chk(char *argv[])
- {
- opt_flg = owrt_flg = name_flg = OFF;
-
- if (argv[1][0] == '-') {
- opt_flg = ON;
- if (argv[1][1] == 'd') {
- owrt_flg = ON;
- } else if (argv[1][1] == 'D') {
- name_flg = ON;
- } else {
- err_msg1();
- }
- }
- }
-
- void file_open(char *argv[])
- {
- int i;
- char fname[64];
-
- if (NULL == (fp1 = fopen(argv[file_cnt], "r"))) {
- printf("\n Cannot Open File(1) : %s\n\n", argv[file_cnt]);
- exit(1);
- }
- if (owrt_flg == ON) { /* -d オプション */
- if (NULL == (fp2 = fopen (temp, "w"))) {
- printf("\n Cannot Open File(2) : %s(%s)\n\n", temp, argv[file_cnt]);
- exit(1);
- }
- } else {
- strcpy(fname, argv[file_cnt+1]);
- if (name_flg == ON) { /* -D オプション */
- strcpy(fname, argv[file_cnt]);
- for (i = 0; ; i++) {
- if (fname[i] == '.') {
- strncpy(&fname[i+1], "euc", 4);
- break;
- } else if (fname[i] == (char)NULL) {
- strncpy(&fname[i], ".euc", 5);
- break;
- }
- }
- printf("output file name = %s\n",fname);
- if (NULL == (fp2 = fopen (fname, "w"))) {
- printf("\n Cannot Open File(3) : %s\n\n", fname);
- exit(1);
- }
- } else {
- fp2 = stdout;
- }
- }
- }
-
- void kana_cnv(int *cnt1, int *cnt2)
- {
- buff2[*cnt2] = 0x8e;
- buff2[(*cnt2)+1] = buff1[*cnt1];
- (*cnt2)++;
- }
-
- void kanji_cnv(int *cnt1, int *cnt2)
- {
- unsigned char tmp, add = 0;
- int mode = 0;
-
- if (0x81 <= buff1[*cnt1] && buff1[*cnt1] <= 0x9f) {
- mode = 1;
- tmp = buff1[*cnt1] - (char)0x81;
- }
- if (0xe0 <= buff1[*cnt1] && buff1[*cnt1] <= 0xfc) {
- mode = 2;
- tmp = buff1[*cnt1] - (char)0xe0;
- }
- if (mode == 1 || mode == 2) {
- if (buff1[(*cnt1)+1] >= 0x40 && buff1[(*cnt1)+1] <= 0xfc) {
- if (buff1[(*cnt1)+1] >= 0x80 && buff1[(*cnt1)+1] < 0x9f) {
- buff1[(*cnt1)+1] = buff1[(*cnt1)+1]-(char)1;
- }
- if (buff1[(*cnt1)+1] >= 0x40 && buff1[(*cnt1)+1] <= 0x9e) {
- buff2[(*cnt2)+1] = buff1[(*cnt1)+1] + (char)0x61;
- add = (char)(tmp*2+1);
- } else {
- if (buff1[(*cnt1)+1] >= 0x9f && buff1[(*cnt1)+1] <= 0xfe) {
- buff2[(*cnt2)+1] = buff1[(*cnt1)+1] + (char)0x02;
- add = (char)(tmp*2+2);
- }
- }
- if (mode == 2) {
- buff2[(*cnt2)+1] = buff1[(*cnt2)+1]+(char)1;
- }
- buff2[*cnt2] = (char)(0xa1 + add-1);
- (*cnt2)++, (*cnt1)++;
- } else {
- not_kanji++;
- }
- mode = 0;
- }
- }
-
- #if MS_DOS
- void file_mv(char *old, char *new) /* MS-DOS */
- {
- int ret;
-
- ret = remove(new);
- if (ret != 0) {
- printf("remove エラー = %d\n", ret);
- }
- ret = rename(old, new);
- if (ret != 0) {
- printf("rename エラー = %d\n", ret);
- }
- }
- #endif
-
- #if UNIX
- void file_mv(char *old, char *new) /* UNIX */
- {
- unsigned int i;
- int j;
-
- if (NULL == (fp1 = fopen (old, "r"))) {
- exit(1);
- }
- if (NULL == (fp2 = fopen (new, "w"))) {
- exit(1);
- }
- for (i = 0; i < LINE_MAX; i++) {
- if (NULL == fgets (buff1, BUFF_MAX, fp1)) {
- break;
- }
- for (j = 0; j < BUFF_MAX; j++) {
- buff2[j] = buff1[j];
- }
- fputs(buff2, fp2);
- }
- fclose(fp1);
- fclose(fp2);
- sprintf(com1, "rm %s", old);
- system(com1); /* file delete */
- }
- #endif
-
- void err_msg1(void)
- {
- printf("stoe (Ver. %s)\n" , VER);
- printf("Usage: stoe [-d|-D] <filename>...\n");
- printf("\nEx.)\n");
- printf(" stoe <filename>...\n");
- printf(" stoe -d filename (Over Wriete)\n");
- printf(" stoe -D filename (xxxxxxxx.euc)\n");
- exit(1);
- }
-
- void err_msg2(char *argv[]) /* error messge */
- {
- if (not_kanji != 0) {
- printf ("\n%s : count of bad KANJI code pair(s)= %d\n",
- argv[file_cnt], not_kanji);
- }
- }
-